/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: recv1.c
> Author:cjy
> Mail: 
> Created Time: 2024年08月05日 星期一 15时50分38秒
***************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf{
    long mtype;   // 消息类型
    char mtext[100]; 
};

typedef struct use{
    char name[10];
    int age;
    float score;
} STU;

int main(int argc, const char* argv[])
{
    char path[50] = {0};
    key_t key = 0; // 消息队列标识符
    int msgid = 0; // 消息队列 ID
    int ret = 0; // 函数返回值

    printf("请输入路径:");
    scanf("%s", path);

    key = ftok(path, 1); // 使用 ftok 生成一个唯一的 key
    if (key == -1) {
        perror("ftok");
        exit(-1);    
    }

    msgid = msgget(key, IPC_CREAT | 0666); // 创建或获取消息队列
    if (msgid == -1) {
        perror("msgget");
        exit(-1);    
    }

    struct msgbuf data;
    memset(&data, 0, sizeof(struct msgbuf));

    // 接收一条消息
    while (1) {
        ret = msgrcv(msgid, &data, sizeof(struct msgbuf) - sizeof(long), 1, 0);
        if (ret == -1) {
            perror("msgrcv");
            exit(-1);          // 遇到错误退出程序
        }

        if (strcmp(data.mtext, "EOF") == 0) {
            break;
        }

        STU k;
        memcpy(&k, data.mtext, sizeof(STU));
        printf("age is %d\n", k.age);
        printf("score is %f\n", k.score);
        printf("name is %s\n", k.name);
    }

    // 发送确认消息
    struct msgbuf confirmMsg;
    memset(&confirmMsg, 0, sizeof(struct msgbuf));
    confirmMsg.mtype = 2;
    strcpy(confirmMsg.mtext, "传输成功");

    ret = msgsnd(msgid, &confirmMsg, sizeof(struct msgbuf) - sizeof(long), 0);
    if (ret == -1) {
        perror("msgsnd");
        exit(-1);
    }

    // 删除消息队列
    ret = msgctl(msgid, IPC_RMID, NULL);
    if (ret == -1) {
        perror("msgctl");
        exit(-1);
    }

    printf("完成接收并发送了确认消息。\n");

    return 0;
}




